#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <functional>
#include <sys/types.h>
#include <wait.h>
#include <vector>
void PrintBlock()
{
    sigset_t block;
    sigprocmask(SIG_SETMASK, nullptr, &block);
    std::cout<<"block: ";
    for (int i = 31; i > 0; i--)
    {
        if (sigismember(&block, i))
            std::cout << 1;
        else
            std::cout << 0;
    }
    std::cout << std::endl;
}
void PrintPending()
{
    sigset_t pending;
    sigpending(&pending);
    sigprocmask(SIG_SETMASK, nullptr, &pending);
    std::cout<<"pending: ";
    for (int i = 31; i > 0; i--)
    {
        if (sigismember(&pending, i))
            std::cout << 1;
        else
            std::cout << 0;
    }
    std::cout << std::endl;
}
void handler(int signo)
{
    std::cout << "signo: " << signo << std::endl;
    // while(true)
    // {
    //     PrintBlock();
    //     sleep(3);
    // }
    PrintBlock();
    //PrintPending();
    while(true)
    {

    }
    //sleep(3);
}

int main()
{
    // signal(2,handler);
    struct sigaction act, oldact;
    act.sa_handler = handler;
    sigset_t mask;
    sigemptyset(&mask);
    sigaddset(&mask,2);
    sigaddset(&mask,3);//把三号信号屏蔽
    act.sa_mask = mask;//设置屏蔽信号
    sigaction(2, &act, &oldact);
    // std::cout<<"执行"<<std::endl;
    PrintBlock();
    //PrintPending();
    while (true)
    {

        pause();
        //PrintBlock();
        //PrintPending();
    }
}

// void PrintBlock(const sigset_t &block)
// {
//     std::cout<<"block"<<"["<<getpid()<<"]: ";
//     for (int i = 31; i > 0; i--)
//     {

//         if (sigismember(&block, i))
//         {
//             std::cout << 1;
//         }
//         else
//         {
//             std::cout << 0;
//         }
//     }
//     std::cout << std::endl;
// }
// void handler(int signo)
// {
//     std::cout <<"signo:"<<signo<<" 信号递达"<<std::endl;
//     exit(0);
// }
// int main()
// {
//     signal(2,handler);
//     sigset_t block, oldblock;

//     sigemptyset(&block);
//     // 将二号新号加入
//     sigaddset(&block, 2);

//     int ret = sigprocmask(SIG_SETMASK, &block, &oldblock);
//     if (ret < 0)
//     {
//         perror("sigpromask");
//         exit(1);
//     }
//     int cnt = 0;
//     while (true)
//     {
//         PrintBlock(block);
//         sleep(3);
//         if(cnt==5)
//         {
//             PrintBlock(oldblock);
//             sigprocmask(SIG_SETMASK, &oldblock, nullptr);

//         }
//         cnt++;
//     }
//     return 0;
// }

// void handler(int signo)
// {
//     std::cout<<"signo: "<<signo<<std::endl;
// }
// int main()
// {
//     while(true);
//     return 0;
// }
// int main()
// {
//     //signal(SIGFPE,handler);
//     pid_t pid = fork();
//     if(pid==0)
//     {
//         //子进程
//         int a = 10;
//         a/=0;
//     }
//     else
//     {
//         int status;
//         waitpid(pid,&status,0);
//         std::cout<<"core dump: "<<((status>>7)&1)<<std::endl;
//         std::cout<<"signo: "<<(status&0x7F)<<std::endl;
//     }
// }
// int main()
// {
//     int a = 10;
//     a/=0;
//     return 0;
// }
// int main()
// {
//     int *p = nullptr;
//     *p = 0;
//     return 0;
// }

// using func_t = std::function<void()>;

// int cnt = 0;
// std::vector<func_t> v;

// void handler(int signo)
// {
//     for (auto &e : v)
//     {
//         e();
//     }
//     alarm(2);
//     cnt++;
// }
// int main()
// {
//     v.push_back([]()
//                 { std::cout << "我是一个日志任务" << std::endl; });
//     v.push_back([]()
//                 { std::cout << "我是一个下载任务" << std::endl; });
//     v.push_back([]()
//                 { std::cout << "我是一个mysql任务" << std::endl; });
//     alarm(2);//一次性闹钟，超时后就会被取消
//     signal(SIGALRM, handler);
//     while (true)
//     {
//         int signo = pause();
//         std::cout << "我醒来了..." << std::endl;
//         std::cout << "cnt: " << cnt << std::endl;
//     }
// }

// int main()
// {
//     alarm(5);
//     sleep(1);
//     int n = alarm(0);//alarm(0)取消闹钟   n上一个闹钟剩余的时间
//     std::cout<<n<<std::endl;
//     return 0;
// }

// int cnt = 0;
// void handler(int signo)
// {
//     std::cout<<cnt<<std::endl;
//     exit(0);
// }
// int main()
// {
//     alarm(1);
//     signal(SIGALRM,handler);
//     while(true)
//     {
//         //std::cout<<cnt<<std::endl;
//         cnt++;
//     }
//     return 0;
// }

// void Usage(char* argv)
// {
//     std::cout<<"Usage error: "<<argv<<" signo"<<" pid"<<std::endl;
//     exit(1);
// }
// //./kill 9 pid

// int main(int argc,char* argv[])
// {
//     if(argc!=3)
//     {
//         //正确使用提醒
//         Usage(argv[0]);
//     }

//     int signo = std::stoi(argv[1]);
//     pid_t pid = std::stoi(argv[2]);
//     int ret = kill(pid,signo);

//     if(ret<0)
//     {
//         perror("kill");
//         exit(2);
//     }
//     return 0;

// }
// int main()
// {
//     int cnt= 5;
//     while(true)
//     {
//         std::cout<<cnt<<std::endl;
//         if(cnt<=0)
//             kill(getpid(),SIGQUIT);
//         sleep(1);
//         cnt--;
//     }
//     return 0;
// }

// using func_t = std::function<void(int)>;
// void handler(int signo)
// {
//     std::cout << "signo: " << signo << std::endl;
// }
// int main()
// {

//     //signal(SIGQUIT, handler);
//     for(int i = 1;i<=31;i++)
//     {
//         func_t f = signal(i,handler);
//         std::cout<<"捕捉:"<<i<<std::endl;
//     }
//     while (true)
//     {
//         std::cout << "hello world" << std::endl;
//         sleep(1);
//     }
//     return 0;
// }
